package cn.bugstack.domain.activity.repository;

import cn.bugstack.domain.activity.model.aggregate.CreatePartakeOrderAggregate;
import cn.bugstack.domain.activity.model.aggregate.CreateQuotaOrderAggregate;
import cn.bugstack.domain.activity.model.entity.*;
import cn.bugstack.domain.activity.model.valobj.ActivitySkuStockKeyVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 活动仓储接口
 */
public interface IActivityRepository {
    /**
     * 通过sku查询活动信息
     *
     * @param sku sku ID
     * @return 活动sku实体
     */
    ActivitySkuEntity queryActivitySku(Long sku);

    /**
     * 查询活动信息
     *
     * @param activityId 活动ID
     * @return 活动实体
     */
    ActivityEntity queryRaffleActivityByActivityId(Long activityId);

    /**
     * 查询次数信息（用户在活动上可参与的次数）
     *
     * @param activityCountId 活动次数配置ID
     * @return 活动次数实体
     */
    ActivityCountEntity queryRaffleActivityCountByActivityCountId(Long activityCountId);

    /**
     * 保存返利订单信息【无需支付】
     * @param createOrderAggregate 创建订单聚合对象
     */
    void doSaveNoPayOrder(CreateQuotaOrderAggregate createOrderAggregate);

    /**
     * 保存积分支付订单信息
     * @param createQuotaOrderAggregate 创建订单聚合对象
     */
    void doSaveCreditPayOrder(CreateQuotaOrderAggregate createQuotaOrderAggregate);

    /**
     * 缓存活动sku对应的库存信息
     *
     * @param cacheKey   缓存key
     * @param stockCount sku对应的库存剩余
     */
    void cacheActivitySkuStockCount(String  cacheKey, Integer stockCount);

    /**
     * 根据策略ID和奖品ID，扣减奖品缓存库存
     *
     * @param sku         sku
     * @param cacheKey    缓存key
     * @param endDateTime 活动结束时间
     * @return 扣减结果
     */
    boolean subtractionActivitySkuStock(Long sku, String cacheKey, Date endDateTime);

    /**
     * 写入延迟队列，延迟消费更新库存记录
     *
     * @param activitySkuStockKeyVO 活动sku库存 key值对象
     */
    void activitySkuStockConsumeSendQueue(ActivitySkuStockKeyVO activitySkuStockKeyVO);

    /**
     * 获取活动sku库存消耗队列
     *
     * @return 奖品库存key信息
     */
    ActivitySkuStockKeyVO takeQueueValue();

    /**
     * 清空队列
     */
    void clearQueueValue();

    /**
     * 延迟队列 + 任务趋势更新活动sku库存
     *
     * @param sku 活动商品
     */
    void updateActivitySkuStock(Long sku);

    /**
     * 缓存库存已消耗完毕，清空数据库库存
     *
     * @param sku 活动商品
     */
    void clearActivitySkuStock(Long sku);

    /**
     * 保存参与活动订单聚合对象
     * @param createPartakeOrderAggregate 参与活动订单聚合对象
     */
    void saveCreatePartakeOrderAggregate(CreatePartakeOrderAggregate createPartakeOrderAggregate);

    /**
     * 查询没有使用的订单
     * @param partakeRaffleActivityEntity 参与抽奖活动实体对象
     * @return 用户抽奖订单实体对象
     */
    UserRaffleOrderEntity queryNoUsedRaffleOrder(PartakeRaffleActivityEntity partakeRaffleActivityEntity);

    /**
     * 查询没有使用的订单
     * @param userId 用户ID
     * @param activityId 活动ID
     * @return 用户抽奖订单实体对象
     */
    UserRaffleOrderEntity queryNoUsedRaffleOrder(String userId, Long activityId);
    /**
     * 查询总账户额度
     * @param userId 用户ID
     * @param activityId 活动ID
     * @return 活动账户实体对象
     */
    ActivityAccountEntity queryActivityAccountByUserId(String userId, Long activityId);

    /**
     * 查询月账户
     * @param userId  用户ID
     * @param activityId 活动ID
     * @return 活动月账户实体对象
     */
    ActivityAccountMonthEntity queryActivityAccountMonthByUserId(String userId, Long activityId,String month);

    /**
     * 查询日账户
     * @param userId  用户ID
     * @param activityId 活动ID
     * @return 活动日账户实体对象
     */
    ActivityAccountDayEntity queryActivityAccountDayByUserId(String userId, Long activityId,String day);

    /**
     * 通过活动ID查询活动sku实体列表
     * @param activityId 活动ID
     * @return 活动sku实体列表
     */
    List<ActivitySkuEntity> queryActivitySkuListByActivityId(Long activityId);


    /**
     * 查询用户当天的抽奖次数
     * @param activityId 活动ID
     * @param userId 用户ID
     * @return 用户当天抽奖次数
     */
    Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId);

    /**
     * 查询活动账户实体
     * @param userId 用户ID
     * @param activityId 活动ID
     * @return 活动账户实体
     */
    ActivityAccountEntity queryActivityAccountEntity(String userId, Long activityId);

    /**
     * 查询用户的抽奖次数
     * @param userId 用户ID
     * @param activityId 活动ID
     * @return 用户抽奖次数
     */
    Integer queryRaffleActivityAccountPartakeCount(String userId, Long activityId);

    /**
     * 更新订单
     * @param deliveryOrderEntity 发送订单实体
     */
    void updateOrder(DeliveryOrderEntity deliveryOrderEntity);

    /**
     * 查询未支付活动订单
     * @param skuRechargeEntity 活动商品充值实体对象
     * @return 未支付活动订单实体
     */
    UnpaidActivityOrderEntity queryUnpaidActivityOrder(SkuRechargeEntity skuRechargeEntity);

    /**
     * 通过活动ID查询sku商品实体列表
     * @param activityId 活动ID
     * @return sku商品实体列表
     */
    List<SkuProductEntity> querySkuProductEntityListByActivityId(Long activityId);

    /**
     * 查询用户积分账户额度
     * @param userId 用户ID
     * @return 用户积分账户额度
     */
    BigDecimal queryUserCreditAccountAmount(String userId);
}
